/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package algoritmo2;

import algoritmo2.cruces.Cruce;
import algoritmo2.cruces.Cruce1;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * @author Ra
 */
public class pruebaArbol {

    public static void main(String[] args){
        System.out.println("Creando arbol de prueba:");
        ArrayList<String> cjtoFun = new ArrayList<String>();
        cjtoFun.add("AND");
        cjtoFun.add("OR");
        cjtoFun.add("NOT");
        cjtoFun.add("IF");
        ArrayList<String> cjtoTer = new ArrayList<String>();
        cjtoTer.add("A0");
        //cjtoTer.add("A1");
        cjtoTer.add("D0");
        cjtoTer.add("D1");
        //cjtoTer.add("D2");
        //cjtoTer.add("D3");


        Map valores= new HashMap();
        valores.put("A0", 1);
        valores.put("A1", 1);
        valores.put("D0", 1);
        valores.put("D1", 1);
        valores.put("D2", 1);
        valores.put("D3", 1);
        valores.put("D4", 1);



        Arbol arbol = new Arbol(cjtoFun,cjtoTer,3,0, null, false, true,false,true);
        Arbol arbol2 = new Arbol(cjtoFun,cjtoTer,4,0, null, false, true,false,true);
        //Individuo individuo1 = new Individuo();
        /*Individuo individuo2 = new Individuo();
        individuo1.setArbol(arbol);
        individuo2.setArbol(arbol2);
        individuo1.setHmax(3);
        individuo2.setHmax(3);
        Cruce cruce = new Cruce1();
        System.out.println("Arbol: " + arbol.toString());
        System.out.println("Arbol2: " + arbol2.toString());
        Individuo hijo1 = new Individuo(),hijo2 = new Individuo();
        cruce.cruce(individuo1, individuo2, hijo1, hijo2);*/
        System.out.println("arbol " + arbol.toString());
        System.out.println(arbol.comprobarBuenaConstruccionArbol());


        


        //System.out.println("hijo1: " + hijo1.getArbol());
        //System.out.println("hijo2: " + hijo2.getArbol());
        Map<String, Integer>[] arrayValores = generarDatos();
        int aciertos = 0;
        int fallos = 0;
        for(int i = 0; i < arrayValores.length; i++){
            int resultado = arbol.evalua(arrayValores[i]);
            if(resultado == arrayValores[i].get("S")){
                //System.out.println("ACIERTO!!!!");
                aciertos++;
            }
            else{
                //System.out.println("FALLO!!!!");
                fallos++;
            }
        }
        System.out.println("El número de aciertos han sido " + aciertos + " y el número de fallos " + fallos);

         //int resultado = arbol.evalua(valores);
        //System.out.println("El resultado del arbol es " + resultado);*/

    }

    public static Map<String, Integer>[] generarDatos(){
        Map<String, Integer>[] maps = new HashMap[64];
        int i = 0;
        for(int a0 = 0; a0<2; a0++){
            for(int a1 = 0; a1 <2; a1++){
                for(int d0 = 0; d0 < 2; d0++){
                    for(int d1 = 0; d1 < 2; d1++){
                        for(int d2 = 0; d2 < 2; d2++){
                            for(int d3 =0; d3 < 2; d3++){
                                maps[i] = new HashMap<String, Integer>();
                                maps[i].put("A0", a0);
                                maps[i].put("A1", a1);
                                maps[i].put("D0",d0);
                                maps[i].put("D1", d1);
                                maps[i].put("D2", d2);
                                maps[i].put("D3", d3);
                                if(a1 == 0 && a0 == 0){
                                    maps[i].put("S",d0);
                                } else if(a0==1 && a1 == 0){
                                    maps[i].put("S", d1);
                                } else if(a0==0 && a1 == 1){
                                    maps[i].put("S", d2);
                                }else{
                                    maps[i].put("S", d3);
                                }
                                i++;
                            }
                        }
                    }
                }
            }
        }
        return maps;
    }
}
